﻿using System;
using System.Linq;
using System.Windows.Forms;
using System.IO;
using AForge.Imaging;
using AForge.Math;

namespace Analizador_de_Semillas
{
    public partial class MainForm : Form
    {
        private static string substringDirectory;
        private static string path;
        private static String canal;
        private static string img;

        public MainForm()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.cmbDiscos.Items.AddRange(Environment.GetLogicalDrives());
        }

        private void cmbDiscos_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                if (!this.cmbDiscos.Text.Equals(""))
                {
                    this.tvCarpetas.Nodes.Clear();

                    this.tvCarpetas.Nodes.Add(this.cmbDiscos.Text);

                    PopulateTreeView(this.cmbDiscos.Text, this.tvCarpetas.Nodes[0]);
                }
            }
            catch (Exception)
            {
                
                throw;
            }
        }

        public void PopulateTreeView(string directoryValue, TreeNode parentNode)
        {
            string[] directoryArray =
             Directory.GetDirectories(directoryValue);

            try
            {
                if (directoryArray.Length != 0)
                {
                    foreach (string directory in directoryArray)
                    {
                        substringDirectory = directory.Substring(
                        directory.LastIndexOf('\\') + 1,
                        directory.Length - directory.LastIndexOf('\\') - 1);

                        TreeNode myNode = new TreeNode(substringDirectory);
                        
                        parentNode.Nodes.Add(myNode);

                        PopulateTreeView(directory, myNode);
                    }
                }
            }
            catch (UnauthorizedAccessException)
            {
                parentNode.Nodes.Add("Access denied");
            } // end catch
        }

        private void tvCarpetas_AfterSelect(object sender, TreeViewEventArgs e)
        {
            this.lstArchivos.Items.Clear();

            try
            {
                if (!this.tvCarpetas.SelectedNode.Text.Equals(""))
                {
                    path = this.tvCarpetas.SelectedNode.FullPath;

                    DirectoryInfo dir = new DirectoryInfo(path);

                    FileInfo[] files = dir.GetFiles();

                    foreach (var file in files)
                    {
                        this.lstArchivos.Items.Add(file.Name);
                    }
                }
            }
            catch (Exception)
            {
                

            }
        }

        private void rdRojo_CheckedChanged(object sender, EventArgs e)
        {
            canal = this.rdRojo.Text;
        }

        private void rdAzul_CheckedChanged(object sender, EventArgs e)
        {
            canal = this.rdAzul.Text;
        }

        private void rdVerde_CheckedChanged(object sender, EventArgs e)
        {
            canal = this.rdVerde.Text;
        }

        private void CargarDgv(string color)
        {
            ImageStatistics stats = Analizador.StatisticsImage(picImagen);
            Histogram histo = null;

            int min = 0;
            int max = 0;
            double stddev = 0;
            double mean = 0;
            int median = 0;
            long total = 0;
            int moda = 0;
            int objetos = 0;

            switch (color)
            {
                case "Rojo":
                    histo = new Histogram(stats.Red.Values);
                    max = histo.Max;
                    min = histo.Min;
                    stddev = histo.StdDev;
                    mean = histo.Mean;
                    median = histo.Median;
                    total = histo.TotalCount;
                    moda = Statistics.Mode(histo.Values);
                    objetos = Analizador.ContarObjetos(picImagen);

                    object[] rojo = {img,path + "\\" + img,color,total,objetos,max,min,Math.Round(mean,2),median,moda,Math.Round(stddev,2)};

                    this.dgvResultados.Rows.Add(rojo);

                    break;

                case "Azul":
                    histo = new Histogram(stats.Blue.Values);
                    max = histo.Max;
                    min = histo.Min;
                    stddev = histo.StdDev;
                    mean = histo.Mean;
                    median = histo.Median;
                    total = histo.TotalCount;
                    moda = Statistics.Mode(histo.Values);
                    objetos = Analizador.ContarObjetos(picImagen);

                    object[] azul = { img, path + "\\" + img, color, total,objetos, max, min, Math.Round(mean, 2), median, moda, Math.Round(stddev, 2) };

                    this.dgvResultados.Rows.Add(azul);

                    break;

                case "Verde":
                    histo = new Histogram(stats.Green.Values);
                    max = histo.Max;
                    min = histo.Min;
                    stddev = histo.StdDev;
                    mean = histo.Mean;
                    median = histo.Median;
                    total = histo.TotalCount;
                    moda = Statistics.Mode(histo.Values);
                    objetos = Analizador.ContarObjetos(picImagen);

                    object[] verde = { img, path + "\\" + img, color, total,objetos, max, min, Math.Round(mean, 2), median, moda, Math.Round(stddev, 2) };

                    this.dgvResultados.Rows.Add(verde);
                    BlobCounter count = new BlobCounter();
                    
                    break;
            }
        }

        private void btnProcesar_Click(object sender, EventArgs e)
        {
            if (!this.lstArchivos.SelectedItem.Equals(""))
            {
                img = this.lstArchivos.SelectedItem.ToString();

                this.picImagen.Load(path + "\\" + this.lstArchivos.SelectedItem.ToString());
            }

            if (canal.Equals("Todos"))
            {

                if (ValidarExistencia("Rojo") == false)
                {
                    Analizador.CargarHistograma(picImagen, chrHistograma, "Rojo");
                    CargarDgv("Rojo");
                }

                if (ValidarExistencia("Azul") == false)
                {
                    Analizador.CargarHistograma(picImagen, chrHistograma, "Azul");
                    CargarDgv("Azul");
                }

                if (ValidarExistencia("Verde") == false)
                {
                    Analizador.CargarHistograma(picImagen, chrHistograma, "Verde");
                    CargarDgv("Verde");
                }
            }
            else
            {
                if (ValidarExistencia(canal) == false)
                {
                    Analizador.CargarHistograma(picImagen, chrHistograma, canal);
                    CargarDgv(canal);
                }
            }
           

            
        }

        private void rdTodos_CheckedChanged(object sender, EventArgs e)
        {
            canal = this.rdTodos.Text;
        }

        private void btnLimpiar_Click(object sender, EventArgs e)
        {
            Limpiar();
        }

        private void Limpiar()
        {
            this.chrHistograma.Series.Clear();
            this.dgvResultados.Rows.Clear();
        }

        private bool ValidarExistencia(string color)
        {
            bool existe = false;

            foreach (DataGridViewRow row in dgvResultados.Rows)
            {
                if (row.Cells[2].Value.Equals(color))
                {
                    existe = true;
                    break;
                }
            }

            return existe;
        }

        private void btnExportar_Click(object sender, EventArgs e)
        {
            Exportador.Exportar(dgvResultados,Analizador.StatisticsImage(picImagen),canal);
        }
    }
}
